NAT Gatewayを集約したらECRが動かなくなった話
こんにちは!AWS事業本部コンサルティング部のたかくに(@takakuni_)です。
今回は、タイトルの通り「NAT Gateway集約したらECRが動かなくなった話」をご紹介したいと思います。
はじめに
皆さんは、Transit Gatewayを使用したNAT Gatewayの集約した構成をご存知でしょうか?
ざっくりご説明するとTransit Gatewayを使用すると複数VPCのアウトバウンドを集約できます。
「各VPCにNAT Gatewayを配置すると高いので、ネットワークを集約したVPCのパブリックサブネットにNAT Gatewayを配置して共有しよう」といった構成になります。
詳しくは以下のブログをご覧ください。
本題
私も上記のコスト最適化を行いたく、Transit Gatewayを使用してNAT Gatewayを集約しました。
図にすると以下のイメージです。
明らかにS3のエンドポイントが怪しいですが今は気にしないでください。
私の場合、以下のようなエラーが起き、ECSタスクがECRからイメージを取得できないエラーが発生しました。
CannotPullContainerError: ref pull has been retried 5 time(s): failed to copy: httpReadSeeker: failed open: failed to do request: Get https://prod-ap-northeast-1-starport-layer-bucket.s3.ap-northeast-1.amazonaws.com/
starport-layer-bucketとは
ドキュメントにも記載がありますが、ECRはAmazon S3を使用してイメージレイヤーを保存する仕組みとなっているそうです。そのため、ECRからイメージを取得する際は、S3への経路も考慮する必要があります。
「prod-ap-northeast-1-starport-layer-bucket」は、ECSタスクからECRへプルする際に使用するバケットの1つです。具体的には東京リージョンでECSタスクをデプロイした場合に使用されるS3バケットになります。
つまり何が起こっているの?
エラーの原因を図示すると以下になります。
ECSタスクは、Transit Gateway先のS3ゲートウェイエンドポイントを経由して、「starport-layer-bucket」バケットに到達しようとします。しかし、ゲートウェイ型 VPCエンドポイントの場合、VPC外からはエンドポイントを使用できないためエラーを返す状態になっています。
解決方法
ゲートウェイエンドポイントを各VPCに配置する
各VPCにゲートウェイエンドポイントを配置することでS3への経路を変更します。コスト的にもゲートウェイ型エンドポイントは、各VPCに作成することをオススメします。
ただし、ネットワークを集約しているVPCでNetwork Firewall等のアプライアンス製品を使用している場合は注意が必要です。
まとめ
今回は、「NAT Gatewayを集約したらECRが動かなくなった話」をご紹介しました。
意外とS3起点でサービスが成り立っているものもあるので、今まで動いていたものがNAT Gatewayを集約したら動かなくなった場合の解決方法の1つとして使えるかもしれません。
(余談ですが、Amazon Linux2のyum update
もデフォルトではS3起点のため動かなかったです。)
このブログがどなたかの参考になれば幸いです。
以上、AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!